package com.crm.custinfo.service;

import java.util.List;
import java.util.Map;

import com.crm.custinfo.domain.CustInfo;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import org.apache.logging.log4j.Logger;

/**
 * 客户信息Service接口
 *
 * @author ruoyi
 * @date 2023-12-28
 */
public interface ICustInfoService {
    /**
     * 查询客户信息
     *
     * @param id 客户信息主键
     * @return 客户信息
     */
    public CustInfo selectCustInfoById(Long id);

    /**
     * 查询客户信息列表
     *
     * @param custInfo 客户信息
     * @return 客户信息集合
     */
    public List<CustInfo> selectCustInfoList(CustInfo custInfo);

    /**
     * 查找单条客户信息
     *
     * @param custInfo 客户信息
     * @return 客户信息集合
     */
    public CustInfo selectCustInfo(CustInfo custInfo);

    /**
     * 查询客户信息列表
     *
     * @param custInfo 客户信息
     * @return 客户信息集合
     */
    public List<CustInfo> selectCustInfoList2(CustInfo custInfo);

    /**
     * 查询我的客户列表+分页
     *
     * @param custInfo 客户信息
     * @return 客户信息集合
     */
    public List<CustInfo> selectMyCustList(CustInfo custInfo);

    /**
     * 新增客户信息
     *
     * @param custInfo 客户信息
     * @return 结果
     */
    public int insertCustInfo(CustInfo custInfo);

    int updateCustInfo2(CustInfo custInfo);

    /**
     * 修改客户信息
     *
     * @param custInfo 客户信息
     * @return 结果
     */
    public int updateCustInfo(CustInfo custInfo);

    /**
     * 解密手机号
     *
     * @param custInfo 客户信息
     * @return 结果
     */
    public AjaxResult decryptMobile(CustInfo custInfo);

    /**
     * 加密存储，删除明文
     *
     * @param custInfo
     * @param logger
     */

    public void encryptMobile(CustInfo custInfo, org.slf4j.Logger logger);

    /**
     * 批量删除客户信息
     *
     * @param ids 需要删除的客户信息主键集合
     * @return 结果
     */
    public int deleteCustInfoByIds(Long[] ids);

    /**
     * 删除客户信息信息
     *
     * @param id 客户信息主键
     * @return 结果
     */
    public int deleteCustInfoById(Long id);

    /**
     * 数据获取设置
     *
     * @return
     */
    public boolean setFetchConfig(long orgId, int type, int fetchCountLimit, String fetchIsOpen);

    /**
     * 校验获取数据当前是否在某时间段内
     */
    public boolean checkFetchDatalimit(String fetchTimeLimit);

    /**
     * 个人客户/团队客户超过2,10,30天未跟进的数据
     *
     * @param type    1-个人客户 2-团队客户
     * @param roleMap
     */
    public Map<String, Object> unfollowMorethandays(String type, Map<String, Object> roleMap);

    /**
     * 获取星级数据
     *
     * @param params
     * @return
     */
    public List<Map<String, Object>> getStarStatusDetail(Map<String, Object> params);

    List<Map<String, Object>> getStarStatusDetail2(Map<String, Object> params);

    /**
     * 将客户批量加入公共池
     *
     * @param ids 需要更新的数据主键集合
     * @return 结果
     */
    public int batchUpdateToPublic(Long[] ids);

    /**
     * 判断是否存在相同数据
     *
     * @param mobileMd5 加密号码
     * @return 结果
     */
    public int countByMd5(String mobileMd5);

    /**
     * 获取未指派的数据总量
     *
     * @param city 城市
     * @return 结果
     */
    public int countByNotAssigned(String city);

    /**
     * 手动回收客户到待分配列表
     *
     * @param custInfo 客户信息
     * @return 客户信息集合
     */
    public int batchToBeAllocated(CustInfo custInfo);

    /**
     * 获取当天的用户数量
     *
     * @param params
     * @return
     */
    public int findDistCount(Map<String, Object> params);

    /**
     * 检查客户信息完整性、渠道、金额、年龄等是否满足进库基本要求
     *
     * @param custInfo
     * @param logger
     * @return
     * @throws Exception
     */
    public Map<String, Object> checkCustInfo(CustInfo custInfo, org.slf4j.Logger logger);

    /**
     * 新数据分配给原客户经理
     *
     * @param custInfo
     * @param lastCustId
     * @param lastUser
     * @param logger
     * @return
     */
    public boolean dealCustReplay(CustInfo custInfo, Long lastCustId, SysUser lastUser, org.slf4j.Logger logger);

    /**
     * 获取对应城市的部门ids
     *
     * @param cityName
     * @return
     */
    public Long[] getOrgIdsByCity(String cityName);

    /**
     * 新数据随机分配
     *
     * @param custInfo  待分配的客户信息
     * @param orgIds    可分配的部门ids
     * @param checkTime 是否检查分配时间
     * @param logger
     * @return
     */
    public boolean dealCustRandomly(CustInfo custInfo, Long[] orgIds, boolean checkTime, boolean isSwitch, org.slf4j.Logger logger);

    /**
     * 客户数据统计报表专用
     *
     * @param params
     * @return
     */
    public List<Map<String, Object>> commonStatics(Map<String, Object> params);

    void autoDistributeCustDatas();

    /**
     * 获取手机号前8位
     * @param mobile
     * @return
     */
    public List<String> getLikeMobile(String mobile);
    /**
     * 根据号码的前三位匹配数据
     *
     * @param params 获取数据的集合
     * @return 结果
     */
    public List<Map<String, Object>> getCustInfoByMobilePrevious3(Map<String, Object> params);
}
